package com.itheima.controller;

import com.itheima.common.constant.MessageConstant;
import com.itheima.common.entity.PageResult;
import com.itheima.common.entity.QueryPageBean;
import com.itheima.common.entity.Result;
import com.itheima.common.utils.AliOssUtil;
import com.itheima.config.RedisConfiguration;
import com.itheima.pojo.Setmeal;
import com.itheima.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j
@RequestMapping("/setmeal")
public class SetmealController {
    @Autowired
    private SetmealService setmealService;
    @Autowired
    private AliOssUtil aliOssUtil;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    // 分页查询所有套餐
    @PostMapping("/findPage")
    public PageResult getSetmeal(@RequestBody QueryPageBean queryPageBean) {
        return setmealService.getSetmeal(queryPageBean);
    }
    /**
     * 处理添加套餐的POST请求
     *
     * @param checkGroupIds 检查组ID数组，用于关联套餐和检查组
     * @param setmeal 套餐对象，包含套餐的详细信息
     * @return 返回执行结果，表明套餐是否成功添加
     *
     * 注：此方法负责将套餐信息及其关联的检查组ID添加到系统中，并将套餐的图片信息存储在Redis中
     */
    @PostMapping("/add")
    public Result add(Integer[] checkGroupIds, @RequestBody Setmeal setmeal) {
        // 调用业务服务添加套餐和检查组的关联信息
        Result result = setmealService.add(checkGroupIds, setmeal);
        // 将套餐的图片添加到Redis的"used_images"集合中，用于图片管理
        redisTemplate.opsForSet().add("used_images", setmeal.getImg());
        // 返回添加结果
        return result;
    }
    @PostMapping("/delete")
    public Result delete(Integer id) {
        return setmealService.delete(id);
    }

    @GetMapping("/findById")
    public Result findById(Integer id) {
        Setmeal setmeal = setmealService.findById(id);
        return new Result(true, "查询成功", setmeal);
    }
    @PostMapping("/edit")
    public Result edit(@RequestBody Setmeal setmeal) {
        redisTemplate.opsForSet().add("used_images", setmeal.getImg());
        return setmealService.edit(setmeal);
    }



/**
     * 文件上传方法
     *
     * 该方法接收一个multipart文件作为输入，并尝试将其上传到阿里云OSS服务中
     * 使用UUID作为文件名以避免文件覆盖的问题，并保留原始文件的扩展名
     * 如果上传成功，返回上传结果信息；如果上传失败，则记录错误日志并返回上传失败的结果
     *
     * @param file 用户上传的文件，作为multipart形式的文件输入
     * @return 返回上传结果的封装对象Result
     */

    @PostMapping("/upload")
    public Result upload(@RequestParam("imgFile") MultipartFile file) {
        // 检查文件是否为空
        if (file == null || file.isEmpty()) {
            return new Result(false, "MessageConstant.UPLOAD_FAIL", "文件不能为空");
        }

        // 记录日志
        log.info("接收到文件: {}", file);

        try {
            // 获取文件原始名称
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null) {
                return new Result(false, "", "无法获取文件名");
            }

            // 获取文件扩展名
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            // 使用UUID生成新的文件名，防止文件名冲突
            String objectName = UUID.randomUUID().toString() + extension;

            // 调用aliOssUtil.upload方法将文件上传到OSS
            String uploadUrl = aliOssUtil.upload(file.getBytes(), objectName);
            // 如果上传成功，将图片保存在redis中
            redisTemplate.opsForSet().add("uploaded_images", uploadUrl);
            // 返回上传成功的信息
            return new Result(true, MessageConstant.UPLOAD_SUCCESS, uploadUrl);
        } catch (IOException e) {
            // 处理文件上传失败的情况
            log.error("文件上传失败", e);
            return new Result(false, "MessageConstant.UPLOAD_FAIL", "文件上传失败");
        }
    }
}

